package com.zxy.zxyrpc.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.Setting;
import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.yaml.YamlUtil;
import com.zxy.zxyrpc.constant.RpcConstant;

/**
 * 配置工具类(建议配置文件格式都改成utf-8)
 *
 * @author zxy
 * @since 2025/5/11
 **/

public class ConfigUtils {

    /**
     * 加载配置文件默认方法
     *
     * @param tClass 配置名
     * @param prefix 前缀
     * @param <T>    配置类类型
     * @return 配置类
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix) {
        return loadConfig(tClass, prefix, "", "");
    }

    /**
     * 加载配置文件自定义方法（区分环境）
     *
     * @param env    环境类型
     * @param suffix 后缀
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, String env, String suffix) {
        StringBuilder configFileBuilder = new StringBuilder("application");
        if (StrUtil.isNotBlank(env)) {
            configFileBuilder.append("-").append(env);
        }
        // 读取 yaml / properties / setting 文件（默认按 properties 方式读取）
        // todo 可扩展其他文件读取方式
        if (RpcConstant.CONFIG_FILE_SUFFIX_YML.equals(suffix) || RpcConstant.CONFIG_FILE_SUFFIX_YAML.equals(suffix)) {
            configFileBuilder.append(suffix);
            Dict dict = YamlUtil.loadByPath(configFileBuilder.toString());
            return BeanUtil.copyProperties(dict.getBean(prefix), tClass);
        }
        // 参考（待补充）：https://www.jianshu.com/p/48e7256fe225
        else if (RpcConstant.SETTING.equals(suffix)) {
            configFileBuilder.append(suffix);
            Setting setting = new Setting(configFileBuilder.toString());
            return setting.toBean(tClass);
        }
        configFileBuilder.append(".").append(suffix);
        // props 属性操作
        Props props = new Props(configFileBuilder.toString());
        // 配置文件变更时，自动加载(有问题，升级5.8可解)
        props.autoLoad(true);
        return props.toBean(tClass, prefix);
    }
}
